package controllers

import (
	"lottery/web/blue/bluebell/logic"
	"lottery/web/blue/bluebell/models"
	//"bluebell/logic"
	//"bluebell/models"
	"strconv"

	"go.uber.org/zap"

	"github.com/gin-gonic/gin"
)

// 创建帖子
func CreatePostHandler(c *gin.Context) {
	// 1. 获取参数及参数的校验
	p := new(models.Post)
	if err := c.ShouldBindJSON(p); err != nil {
		// 记录出错日志
		zap.L().Error("post.CreatePostHandler.ShouldBindJSON(p) failed", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}
	// 2. 创建帖子
	// 从context取到当前用户的id值
	userID, err := GetCurrentUserID(c)
	if err != nil {
		ResponseError(c, CodeNeedLogin)
		return
	}
	p.AuthorID = userID
	if err := logic.CreatePost(p); err != nil {
		zap.L().Error("logic.CreatePost() failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}
	// 3. 返回响应
	ResponseSuccess(c, nil)
}

// 获取帖子详情
func GetPostDetailHandler(c *gin.Context) {
	// 1. 获取参数
	pidStr := c.Param("id")
	pid, err := strconv.ParseInt(pidStr, 10, 64)
	if err != nil {
		zap.L().Error("controller.GetPostDetailHandler pid failed", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}
	// 2. 查询帖子详情数据
	data, err1 := logic.GetPostById(pid)
	if err1 != nil {
		zap.L().Error("logic.GetPostById(pid) failed", zap.Error(err1))
		ResponseError(c, CodeServerBusy)
		return
	}
	// 3. 返回响应
	ResponseSuccess(c, data)
}

// 获取帖子列表
func GetPostListHandler(c *gin.Context) {
	// 获取数据
	data, err := logic.GetPostList()
	if err != nil {
		zap.L().Error("logic.GetPostList() failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}
	ResponseSuccess(c, data)
}

// 获取帖子列表2：按照redis ZSet存储结果，按照时间，分数进行排序
// GET请求参数获取：/pos/posts2/?page=1&size=10&order=time
func GetPostListHandler2(c *gin.Context) {
	// 1. 获取参数
	// 这里使用c.Query() 也可以定义结构体， 使用c.ShouldBindQuery(). 或者c.ShouldBindUri()都可以获取链接中的路径参数：https://www.topgoer.com/gin%E6%A1%86%E6%9E%B6/gin%E6%95%B0%E6%8D%AE%E8%A7%A3%E6%9E%90%E5%92%8C%E7%BB%91%E5%AE%9A/uri%E6%95%B0%E6%8D%AE%E8%A7%A3%E6%9E%90%E5%92%8C%E7%BB%91%E5%AE%9A.html
	// 初始化结构体，指定默认值
	p := &models.ParamPostList{
		Page:  1,
		Size:  10,
		Order: models.OrderTime, // 默认按照时间进行排序
	}
	if err := c.ShouldBindQuery(p); err != nil {
		zap.L().Error("controllers.post.GetPostListHandler2 with invalid params", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}
	// 2. 根据redis查询 帖子id列表
	data, count, err := logic.GetPostListNew(p)
	// 3. 根据id，去数据库查询帖子详细信息
	if err != nil {
		zap.L().Error("logic.GetPostList2 failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}
	ResponseSuccess1(c, data, count)
}

func GetSomePost(c *gin.Context) {
	com := c.Query("com")
	data := logic.GetSomePost(com)
	ResponseSuccess1(c, data, int64(len(data)))
}

//// 根据社区去查询帖子列表
//func GetCommunityPostListHandler(c *gin.Context) {
//	// 1. 获取参数
//	p := &models.ParamCommunityPostList{
//		ParamPostList:,
//		Size:  10,
//		Order: models.OrderTime, // 默认按照时间进行排序
//	}
//	if err := c.ShouldBindQuery(p); err != nil {
//		zap.L().Error("controllers.post.GetPostListHandler2 with invalid params", zap.Error(err))
//		ResponseError(c, CodeInvalidParam)
//		return
//	}
//	// 2. 根据redis查询 帖子id列表
//	data, err := logic.GetCommunityPostList2(p)
//	// 3. 根据id，去数据库查询帖子详细信息
//	if err != nil {
//		zap.L().Error("logic.GetPostList2 failed", zap.Error(err))
//		ResponseError(c, CodeServerBusy)
//		return
//	}
//	ResponseSuccess(c, data)
//}
